package model;
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */



import java.util.*;

import java.util.regex.Pattern;


import database.Row;
import database.*;
/**
 *
 * @author Dung Doan
 */
public final class OperationNode extends Node{
    public boolean result;
    private ArrayList<Node> arrSubNode;
    private String m_operator;
    public OperationNode(String operator)
    {
        result = false;
        arrSubNode = new ArrayList<Node>();
        m_operator = ParseWhere.getOperator(operator);
        if (m_operator.equalsIgnoreCase(operator) == false)
            CreateTree(operator);
//        if (isOperationNode(m_operator) == false)
//            CreateTree();
    }
//    public OperationNode(Object e)
//    {
//        result = false;
//        arrSubNode = new ArrayList<Node>();
//        ZExpression m_e = (ZExpression) e;
//        m_operator = m_e.getOperator();
//        
//        CreateTree(m_e);
//    }
    
    @Override
    public void AddSubNode(Node node)
    {
        arrSubNode.add(node);
    }
    
    @Override
    public String getNodeType() {
        return "operation";
    }

    @Override
    public boolean check(List<Field> columnName, Row data) 
    {
        if (m_operator.equalsIgnoreCase("AND"))
        {
            for (int i = 0 ; i < arrSubNode.size() ; i++)
                if (arrSubNode.get(i).check(columnName, data) == false)
                    return false;
            return true;
        }
        for (int i = 0 ; i < arrSubNode.size() ; i++)
            if (arrSubNode.get(i).check(columnName, data) == true)
                return true;
        return false;

    }

    @Override
    public void Display() {
       System.out.println(m_operator);
       for (int i = 0 ; i < arrSubNode.size() ; i++)
           arrSubNode.get(i).Display();
    }
    public boolean isOperationNode(String command)
    {
        if (command.equalsIgnoreCase("AND") || command.equalsIgnoreCase("OR"))
            return true;
        return false;
    }
    public boolean isCompareOperator(String op)
    {
        if (op.equals("=") || op.equals(">") || op.equals("<") || op.equals(">=") || op.equals("<="))
            return true;
        return false;
    }
    public void CreateTree(String e)
    {
//        String REGEX = "OR";
//        Pattern p = Pattern.compile(REGEX);
//        String[] items = p.split(m_operator);
//        if (items.length >= 2)
//        {
//            for (int i = 0 ; i < items.length ; i++)
//            {
//                items[i] = TestRegularExp.Normalize(items[i]);
//                AddSubNode(new ExpressionNode(items[i]));
//            }
//            m_operator = "OR";
//            
//        }
//        else
//        {
//            REGEX = "AND";
//            p = Pattern.compile(REGEX);
//            items = p.split(m_operator);
//            for (int i = 0 ; i < items.length ; i++)
//            {
//                items[i] = TestRegularExp.Normalize(items[i]);
//                AddSubNode(new ExpressionNode(items[i]));
//            }
//            m_operator = "AND";
//        }
//        Vector subNodes = e.getOperands();
//        for (int i = 0 ; i < subNodes.size() ; i++)
//        {
//            ZExpression node = (ZExpression) e.getOperand(i);
//            if (isCompareOperator(node.getOperator()))
//                AddSubNode(new ExpressionNode(node.getOperand(0).toString(), node.getOperator(), 
//                            node.getOperand(1).toString()));
//                
//            else
//                AddSubNode(new OperationNode(node));
//        }
        
        ArrayList<String> subNodes = ParseWhere.getOperands(e);
        for (int i = 0 ; i < subNodes.size() ; i++)
        {
            String node = subNodes.get(i);
            if (ParseWhere.getOperator(node) == null)
                AddSubNode(new ExpressionNode(node));
            else
                AddSubNode(new OperationNode(node));
                
        }
        
            
        
    }
}
